home *** CD-ROM | disk | FTP | other *** search
-
- * Small Disk Cache program.
- *
- * By Moshe Braner, 870101.
- *
- * Caches FAT and root directory only.
- *
- * Pure AL version - for a-Seka. 870103.
-
- * install the cache into the rwabs() vector
- pea poke_it
- move.w #$26,-(a7) ; Supexec()
- trap #14
- addq.l #6,a7
-
- * Cconws("\r\n\n\tDisk Cache installed\r\n\n")
- pea msg
- move.w #9,-(a7)
- trap #1
- addq.l #6,a7
-
- * delay
- clr.l d0
- delay:
- addq.l #1,d0
- cmp.l #200000,d0
- blt delay
-
- * terminate, but keep $3300 bytes
- clr.w -(a7)
- move.l #$00003300,-(a7)
- move.w #$31,-(a7)
- trap #1
-
- * Subroutine to copy a sector (512 bytes)
- * from one RAM area (pointed to by A0) to another (A1).
- *
- * D0 is junked.
- * A0,A1 are returned incremented by 512.
-
- copy:
- move.l a0,d0
- btst #0,d0
- bne.s ocopy
- move.l a1,d0
- btst #0,d0
- bne.s ocopy
- move.w #31,d0
- eloop:
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- move.l (a0)+,(a1)+
- dbf d0,eloop
- rts
- ocopy:
- move.w #511,d0
- oloop:
- move.b (a0)+,(a1)+
- dbf d0,oloop
- rts
-
- * Our resident-utility-protocol stuff:
-
- dc.b "CACH" ; magic number
- old:
- dc.l 0 ; space for old vector
-
- * Cache code:
-
- * chache logical sectors 6-17 for drives A and B
- * check for media change before using cached data
- * read from cached data when possible
- * refresh chache after writing or real reading
-
- scache:
- move.w 14(a7),d7 ; drive
- cmp.w #2,d7 ; drive A or B ?
- blt.s doit ; then cache
- usual:
- move.l old,a0 ; old vector
- jmp (a0)
- doit:
- move.l $47e,a3 ; mediach() vector
- move.w d7,-(a7) ; drive no.
- jsr (a3)
- addq.l #2,a7
- lea mark,a3 ; cache validity table
- move.w 12(a7),d6 ; sector no.
- beq.s junk ; junk if reading BPB
- tst.l d0 ; mediach() result
- beq.s noch ; no media change
- junk:
- move.l a3,a0
- tst.w d7 ; drive
- beq.s ja
- adda.w #12,a0
- ja:
- clr.l (a0)+ ; junk all sectors
- clr.l (a0)+
- clr.l (a0)+
- noch:
- subi.w #6,d6 ; we start at sector 6
- bmi.s usual
- move.w 10(a7),d5 ; count of sectors
- add.w d6,d5 ; last sector
- cmpi.w #11,d5
- bgt.s usual
- tst.w d7 ; drive
- beq.s ra
- add.w #12,d5 ; offset for drive B
- add.w #12,d6
- ra:
- tst.w 4(a7) ; rwflag
- bne.s write
- lea space,a0 ; source
- move.w d6,d0
- asl.w #8,d0 ; add 512*sec
- asl.w #1,d0
- adda.w d0,a0 ; real source
- move.l 6(a7),a1 ; destination
- rloop:
- tst.b 0(a3,d6) ; sector cache valid?
- beq.s write
- bsr copy
- addq.w #1,d6
- cmp.w d5,d6 ; any more sectors?
- blt.s rloop
- clr.l d0 ; no errors
- rts
- write:
- move.w d5,d7
- sub.w d6,d7 ; what's left
- move.w 10(a7),d0 ; old sec count
- move.w d7,10(a7) ; new count
- sub.w d7,d0 ; the part done
- add.w d0,12(a7) ; new first sector
- move.w d6,d0
- jloop:
- clr.b 0(a3,d0) ; sector cache invalid
- addq.w #1,d0
- cmp.w d5,d0 ; any more sectors?
- bne.s jloop
- lea retsav,a0
- move.l (a7)+,(a0) ; save return address
- pea comeback ; our return address
- bra usual ; do usual but return
- comeback:
- move.l retsav,-(a7) ; restore return addr
- tst.l d0 ; any errors?
- bne.s exit ; then return it
- move.w 12(a7),d6 ; sec no.
- subi.w #6,d6
- move.w 10(a7),d5 ; count of sectors
- add.w d6,d5 ; last sector
- move.w 14(a7),d7 ; drive
- beq.s mb
- add.w #12,d5 ; offset for drive B
- add.w #12,d6
- mb:
- lea mark,a3 ; cache validity table
- move.l 6(a7),a0 ; source
- lea space,a1 ; destination
- move.w d6,d0
- asl.w #8,d0 ; add 512*sec
- asl.w #1,d0
- adda.w d0,a1 ; real destination
- wloop:
- lea 0(a3,d6),a4
- bset #0,(a4) ; mark sector cache
- bsr copy
- addq.w #1,d6
- cmp.w d5,d6 ; any more sectors?
- blt.s wloop
- clr.l d0 ; no errors
- exit:
- rts
- retsav:
- dc.l 0
- mark:
- dc.l 0,0,0 ; 12 bytes for drive A
- dc.l 0,0,0 ; 12 bytes for drive B
-
- space: ; cache buffer here
-
- poke_it:
- move.l #$476,a1 ; rwabs() vector
- move.l (a1),a0 ; old vector
- move.l -8(a0),d0 ; magic there?
- cmpi.l #$43414348,d0
- beq.s dont ; then skip
- lea scache,a0
- move.l (a1),-4(a0) ; save old vector
- move.l a0,(a1) ; put new vector
- dont:
- rts
-
- msg:
- dc.b 13,10,10,9
- dc.b "Disk Cache installed"
- dc.b 13,10,10,0
- even
-
- end
-